/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.jeeunit.commands;

import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.tewi.annotations.RunAs;
import pl.tewi.commands.AbstractFrameworkCommand;
import pl.tewi.commands.FrameworkCommand;
import pl.tewi.contexts.ApplicationServerContext;
import pl.tewi.controller.ServerControllerFactory;
import pl.tewi.controllers.ServerController;

/**
 * Statement wstrzykujący do testu zasoby dostępne przez adnotacje ejb resources inject
 * Dostęp do niektórych zasobów może być ograniczony restrykcjami bezpieczeństwa
 * Wymagane jest wtedy pozyskanie np. komponentu EJB przez uwierzytelnionego użytkownika
 * 
 * @author tewi
 */
public class InjectResources extends AbstractFrameworkCommand {

    private static final Logger LOGGER = LoggerFactory.getLogger(InjectResources.class.getName());
    private final FrameworkMethod method;
    private final Object test;

    /**
     * Konstruktor
     * @param statement
     * @param context
     * @param method
     * @param test
     */
    public InjectResources(FrameworkCommand statement, ApplicationServerContext context, FrameworkMethod method, Object test) {
        super(statement, context);
        this.method = method;
        this.test = test;
    }

    @Override
    public void evaluate() throws Throwable {
        LOGGER.debug("InjectResources");
        //Niech kontroler serwera pobierze wymagany zasób
        RunAs runas = method.getAnnotation(RunAs.class);
        ServerController controller = ServerControllerFactory.getServerController(applicationServerContext);
        controller.injectResources(test, (runas != null) ? runas.value() : null);
        fNext.evaluate();
    }
}
